package com.study.stack;


import com.study.common.Util;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/**
 * 后缀表达式 逆波兰表达式计算器完整版 100* (1+1) -6 *5
 */
public class PolandExpression {
    public static void main(String[] args) {
        List<String> strings = Util.stringToFixExpression("1+((2+3)*4)-5");
        strings = listToSubExpression(strings);
        int res = calculation(strings);
        System.out.println("res =====:" + res);

    }

    public static List<String> listToSubExpression(List<String> strings) {
        Stack<String> stack = new Stack<>();
        List<String> subExpression = new ArrayList<>();

//        for (String string : strings) {
//            if ("(".equals(string)) {
//                stack.push(string);
//            }else if (" ".equals(string)){
//            }else if (string.matches("\\d+")) {
//                subExpression.add(string);
//            } else if (")".equals(string)) {
//                while (!stack.peek().equals("(")) {
//                    subExpression.add(stack.pop());
//                }
//                stack.pop();
//            } else {
//                if(!stack.empty()){
//                    int level1 = Util.operatorLevel(string);
//                    if (!stack.peek().equals("(")){
//                        int level2 = Util.operatorLevel(stack.peek());
//                        while (level2 >= level1) {
//                            subExpression.add(stack.pop());
//                            if (stack.isEmpty()){
//                                stack.push(string);
//                                break;
//                            }
//                            level2 = Util.operatorLevel(stack.peek());
//                        }
//                    }
//                }
//                stack.push(string);
//            }
//        }
//        while (!stack.isEmpty()){
//            subExpression.add(stack.pop());
//        }

        for (String fixExpressionElement : strings) {
            if (!" ".equals(fixExpressionElement)) {
                if (fixExpressionElement.matches("\\d+")) {
                    subExpression.add(fixExpressionElement);
                } else if (fixExpressionElement.equals("(")) {
                    stack.push(fixExpressionElement);
                } else if (fixExpressionElement.equals(")")) {
                    while (!"(".equals(stack.peek())) {
                        subExpression.add(stack.pop());
                    }
                    stack.pop();
                } else {
                    while (!stack.isEmpty() && Util.operatorLevel(stack.peek()) >= Util.operatorLevel(fixExpressionElement)) {
                        subExpression.add(stack.pop());
                    }
                    stack.add(fixExpressionElement);
                }
            }
        }
        while (!stack.isEmpty()){
            subExpression.add(stack.pop());
        }
        return subExpression;
    }

    public static int calculation(List<String> subExpression) {
        Stack<String> numberStack = new Stack<>();

        for (String s : subExpression) {
            if (s.matches("\\d+")) {
                numberStack.push(s);
            } else {
                int number1 = Integer.parseInt(numberStack.pop());
                int number2 = Integer.parseInt(numberStack.pop());
                int res =Calculator.doc(number1,number2,s);
                numberStack.push(res+"");
            }
        }
        return Integer.parseInt(numberStack.pop());
    }

}
